#include<iostream>

using namespace std ;

const int maxn = 100010 ;

//下标为 0 的点既是根节点又是 null结点 ，有的结点没有子节点也会让他指向 null
int son[maxn][26] ;
//每个结点最多26个孩子 ， 第一个参数表示那个结点
// 中括号里的是当前结点的地址 ， 第二个括号里的指的是当前结点的儿子编号
int cnt[maxn] ; //当前这个结点结尾的儿子有多少个
int idx = 1;
char str[maxn] ;

//存储一个字符串
void insert(char str []) {
    int p = 0 ; //从根节点开始
    for (int i = 0; str[i] ; ++i) {
        //因为字符串结尾是 '\0' ，所以可以用来当结束标志
        int u = str[i] - 'a' ;  //把每一个字母映射成数字
        if(son[p][u] == 0 ) {
            //如果当前走到的这个结点没有子节点 ， 那么就添加子节点
            son[p][u] = idx ;    //这个操作就是分配一个地址空间给子节点
            idx ++ ;
        }
        p = son[p][u] ;
    }

    cnt[p]++ ;
}

//查找以某个字母结尾的字符串有几个
int query(char str[]) {
    int p = 0 ;
    for (int i = 0; str[i] ; ++i) {
        int u = str[i] - 'a' ;  //找出这个字母映射的值
        if(son[p][u] == 0) {
            return 0 ;  //如果没有这个字符串
        }
        p = son[p][u] ; //p向下移动
    }
    return cnt[p] ;
}

int main() {
    int n ;
    scanf("%d" , &n) ;
    while(n --) {
        char op[2] ;
        scanf("%s%s" , op , str);
        if(op[0] == 'I') {
            insert(str);
        }else{
            printf("%d\n" , query(str));
        }
    }

    return 0;
}